<template>
  <div class="address">
    <Header :isLeft="true" title="选择收货地址" />
    <div class="city_search">
      <div class="search">
        <span class="city" @click="$router.push('/city')">
          {{ city }}
          <i class="fa fa-angle-down"></i>
        </span>
        <i class="fa fa-search"></i>
        <input
          type="text"
          v-model="search_val"
          placeholder="小区/写字楼/学校等"
          v-focus
        />
      </div>
    </div>
    <!-- 注意：这里的 @click 的点击事件是从子组件中注册后传过来的 -->
    <Location @click="selectAddress" :address="address" />
    <div class="area">
      <ul class="area_list" v-for="(item, index) in areaList" :key="index">
        <li @click="selectAddress(item)">
          <h4>{{ item.name }}</h4>
          <p>{{ item.district }}{{ item.address }}</p>
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
import Header from "../components/Header";
import Location from "../components/Location";
import { debounce } from "../utils/debounce";
export default {
  // 换成大写是因为小写 address 会与 <address> 这个内置的 HTML 标签冲突而产生报错
  name: "Address",

  data() {
    return {
      city: "", // 当前的城市
      search_val: "", // 用户搜索的内容
      areaList: [], // 用户搜索的周边信息
    };
  },

  components: {
    Header,
    Location,
  },

  methods: {
    // POI 搜索
    searchPlace() {
      const _self = this;
      AMap.plugin("AMap.Autocomplete", function () {
        // 实例化Autocomplete
        var autoOptions = {
          //city 限定城市，默认全国
          city: _self.city,
        };
        var autoComplete = new AMap.Autocomplete(autoOptions);
        autoComplete.search(_self.search_val, function (status, result) {
          // 搜索成功时，result即是对应的匹配数据
          console.log(result);
          _self.areaList = result.tips;
        });
      });
    },
    // 点击搜索到的条目
    selectAddress(item) {
      // console.log(item);
      // 因为 Location 组件中也用到了这个方法，所以需要对这个方法的参数item进行判断
      if (item) {
        // 有item传入说明点击的是POI搜索过后的地址条目
        this.$store.dispatch(
          "setAddress",
          item.district + item.address + item.name
        );
      } else {
        // 无item传入说明点击的是『当前位置』也就是一开始进来的地址
        this.$store.dispatch("setAddress", this.address);
      }
      // 无论点击的是条位置信息都跳转到home页面
      this.$router.push("/home");
    },
  },
  computed: {
    address() {
      return this.$store.getters.location.formattedAddress;
    },
  },

  watch: {
    // 监听输入框
    // 添加防抖
    search_val: debounce(function () {
      this.searchPlace();
    }, 1000),
  },

  // 组件内部路由守卫
  beforeRouteEnter(to, from, next) {
    // 这里需要注意的是从路由传递过来的信息是在to中而不是在from中
    console.log(to.params.city);
    next((vm) => {
      vm.city = to.params.city;
    });
  },
};
</script>

<style scoped>
.address {
  width: 100%;
  height: 100%;
  overflow: auto;
  box-sizing: border-box;
  padding-top: 45px;
}
.city_search {
  background-color: #fff;
  padding: 10px 20px;
  color: #333;
}
.search {
  background-color: #eee;
  height: 40px;
  border-radius: 10px;
  box-sizing: border-box;
  line-height: 40px;
}
.search .city {
  padding: 0 10px;
}
.city i {
  margin-right: 10px;
}
.search input {
  margin-left: 5px;
  background-color: #eee;
  outline: none;
  border: none;
}

.area {
  margin-top: 16px;
  background: #fff;
}
.area li {
  border-bottom: 1px solid #eee;
  padding: 8px 16px;
  color: #aaa;
}
.area li h4 {
  font-weight: bold;
  color: #333;
  margin-bottom: 5px;
}
</style>